package net.linku.exception;

import org.apache.commons.lang3.StringUtils;

/**
 * 自定义异常类，用于处理系统中的各种异常情况。
 * 该类继承自RuntimeException，可以携带错误码和错误信息。
 *
 * @author SilenceTian
 * @date 2024/3/6
 */
public class LinkUException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    /**
     * 错误码
     */
    protected String errorCode;

    /**
     * 错误信息
     */
    protected String errorMsg;

    /**
     * 返回信息
     */
    private String returnMsg;

    /**
     * 语言
     */
    private String lang;

    /**
     * 是否打印日志
     */
    private Integer printLog;

    /**
     * 默认构造函数
     */
    public LinkUException() {
        this.printLog = 1;
    }

    /**
     * 使用错误码和错误信息构造异常
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     */
    public LinkUException(String errorCode, String errorMsg) {
        super(errorMsg);
        this.printLog = 1;
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    /**
     * 使用错误码、错误信息和是否打印日志构造异常
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     * @param printLog  是否打印日志
     */
    public LinkUException(String errorCode, String errorMsg, Integer printLog) {
        this(errorCode, errorMsg);
        this.printLog = printLog;
    }

    /**
     * 使用错误码、错误信息和异常原因构造异常
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     * @param t         异常原因
     */
    public LinkUException(String errorCode, String errorMsg, Throwable t) {
        super(t);
        this.printLog = 1;
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    /**
     * 使用错误码、错误信息、是否打印日志和异常原因构造异常
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     * @param printLog  是否打印日志
     * @param t         异常原因
     */
    public LinkUException(String errorCode, String errorMsg, Integer printLog, Throwable t) {
        this(errorCode, errorMsg, t);
        this.printLog = printLog;
    }

    /**
     * 使用错误码、错误信息和返回信息构造异常
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     * @param returnMsg 返回信息
     */
    public LinkUException(String errorCode, String errorMsg, String returnMsg) {
        super(errorMsg);
        this.printLog = 1;
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
        this.returnMsg = returnMsg;
    }

    /**
     * 使用错误码、错误信息、返回信息和是否打印日志构造异常
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     * @param returnMsg 返回信息
     * @param printLog  是否打印日志
     */
    public LinkUException(String errorCode, String errorMsg, String returnMsg, Integer printLog) {
        this(errorCode, errorMsg, returnMsg);
        this.printLog = printLog;
    }

    /**
     * 使用错误码、错误信息、返回信息和异常原因构造异常
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     * @param returnMsg 返回信息
     * @param t         异常原因
     */
    public LinkUException(String errorCode, String errorMsg, String returnMsg, Throwable t) {
        super(t);
        this.printLog = 1;
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
        this.returnMsg = returnMsg;
    }

    /**
     * 使用错误码、错误信息、返回信息、是否打印日志和异常原因构造异常
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     * @param returnMsg 返回信息
     * @param printLog  是否打印日志
     * @param t         异常原因
     */
    public LinkUException(String errorCode, String errorMsg, String returnMsg, Integer printLog, Throwable t) {
        this(errorCode, errorMsg, returnMsg, t);
        this.printLog = printLog;
    }

    /**
     * 获取错误码
     *
     * @return 错误码
     */
    public String getErrorCode() {
        return this.errorCode;
    }

    /**
     * 设置错误码
     *
     * @param errorCode 错误码
     */
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    /**
     * 获取错误信息
     *
     * @return 错误信息
     */
    public String getErrorMsg() {
        return this.errorMsg;
    }

    /**
     * 设置错误信息
     *
     * @param errorMsg 错误信息
     */
    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    /**
     * 获取返回信息
     *
     * @return 返回信息
     */
    public String getReturnMsg() {
        return StringUtils.isBlank(this.returnMsg) ? this.errorMsg : this.returnMsg;
    }

    /**
     * 设置返回信息
     *
     * @param returnMsg 返回信息
     */
    public void setReturnMsg(String returnMsg) {
        this.returnMsg = returnMsg;
    }

    /**
     * 获取是否打印日志
     *
     * @return 是否打印日志
     */
    public Integer getPrintLog() {
        return this.printLog;
    }

    /**
     * 设置是否打印日志
     *
     * @param printLog 是否打印日志
     */
    public void setPrintLog(Integer printLog) {
        this.printLog = printLog;
    }

    /**
     * 获取语言
     *
     * @return 语言
     */
    public String getLang() {
        return this.lang;
    }

    /**
     * 设置语言
     *
     * @param lang 语言
     */
    public void setLang(String lang) {
        this.lang = lang;
    }

    /**
     * 重写toString方法，提供更详细的异常信息
     *
     * @return 异常信息字符串
     */
    @Override
    public String toString() {
        return super.toString() + " [errorCode = " + this.errorCode + "，errorMsg=" + this.errorMsg + "]";
    }
}
